import time

from django.core.paginator import Paginator
from django.http import JsonResponse
from django.shortcuts import render
from haystack.views import SearchView

from apps.contents.models import ContentCategory

# Create your views here.
from apps.goods.models import GoodsCategory, SKU

"""
关于模型的分析
1.根据页面效果，尽量多的分析字段
2.分析是保存在一个表中，还是多个表中

多对多关系一般是三个表

"""

# 上传图片
"""# 1.创建客户端
# 2.修改加载配置文件的路径
client = Fdfs_client('utils/fastdfs/client.conf')

# 2.上传文件
# 图片的绝对路径
client.upload_by_filename('/home/superbzq/Pictures/Wallpapers/abc-123.jpg')

# 3.获取file_id .up_load_filename上传成功会返回字典数据
'''
{'Group name': 'group1', 'Remote file_id': 'group1/M00/00/00/wKiDgGEIkoOAITijABEQNJY9yAI433.jpg', 'Status': 'Upload successed.', 'Local file name': '/home/superbzq/Pictures/Wallpapers/abc-123.jpg', 'Uploaded size': '1.00MB', 'Storage IP': '192.168.131.128'}
'''
# 字典中有file_id"""
from django.views import View
from utils.goods import get_categories, get_breadcrumb, get_goods_specs


class IndexView(View):

    def get(self, request):
        """
        首页数据分为两部分
        1部分是商品分类数据
        2部分是广告数据

        """
        # 1.获取分类数据
        categories = get_categories()

        # 2.获取广告数据
        contents = {}
        content_categories = ContentCategory.objects.all()
        for cat in content_categories:
            contents[cat.key] = cat.content_set.filter(status=True).order_by('sequence')

        # 首页后面会讲页面静态化
        # 把数据传递给模板
        context = {
            'categories': categories,
            'contents': contents,
        }

        return render(request, 'index.html', context)


# 根据点击的分类，来获取分类数据()
"""
前端：
    前端会发送一个axios请求，分类id在路由中
    分页的页码（第几页数据），每页多少条数据，排序也会传递过来
    
后端：
    请求：
        接收参数
    业务逻辑：
        根据需求查询数据，将对象数据转换为字典数据
    响应：
        JSON
    
    路由 GET /list/category_id/skus/
    步骤：
        # 1，接收参数
        # 2.获取分类id
        # 3.根据分类id进行数据查询验证
        # 4.获取面包屑数据
        # 5.查询分类对应的sku数据
        # 6.返回响应

"""


class ListView(View):

    def get(self, request, category_id):
        # 1，接收参数
        # 排序字段
        ordering = request.GET.get('ordering')
        # 每页多少条数据
        page_size = request.GET.get('page_size')
        # 第几页的数据
        page = request.GET.get('page')

        # 2.获取分类id
        try:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return JsonResponse({'code': 400, 'errmsg': '参数缺失'})

        # 3.根据分类id进行数据查询验证
        # 4.获取面包屑数据
        breadcrumb = get_breadcrumb(category)

        # 5.查询分类对应的sku数据
        skus = SKU.objects.filter(category=category, is_launched=True).order_by(ordering)

        # 分页
        paginator = Paginator(skus, per_page=page_size)

        # 获取指定页码的数据
        page_skus = paginator.page(page)

        # 将对象转化为字典数据
        sku_list = []
        for sku in page_skus.object_list:
            sku_list.append({
                'id': sku.id,
                'name': sku.name,
                'price': sku.price,
                'default_image_url': sku.default_image.url
            })

        # 获取总页数
        total_num = paginator.num_pages

        # 6.返回响应
        return JsonResponse({'code': 0, 'ermsg': 'ok', 'breadcrumb': breadcrumb, 'list': sku_list, 'count': total_num})


# 搜索
"""
1.不使用like
2.使用全文检索
3.借助搜索引擎实现
4.搜索引擎
"""


class SKUSearchView(SearchView):

    def create_response(self):
        # 获取搜索的结果
        context = self.get_context()

        # 知道有什么数据？
        # 添加断点

        sku_list = []
        for sku in context['page'].object_list:
            sku_list.append({
                'id': sku.object.id,
                'name': sku.object.name,
                'price': sku.object.price,
                'default_image_url': sku.object.default_image.url,
                'searchkey': context.get('query'),
                'page_size': context['page'].paginator.num_pages,
                'count': context['page'].paginator.count
            })

        return JsonResponse(sku_list, safe=False)


# 详情界面
"""
1. 分类数据
2. 面包屑
3. SKU信息
4. 规格信息
"""


class DetailView(View):

    def get(self, request, sku_id):
        try:
            sku = SKU.objects.get(id=sku_id)
        except SKU.DoesNotExist:
            pass

        # 1. 分类数据
        categories = get_categories()
        # 2. 面包屑
        breadcrumb = get_breadcrumb(sku.category)
        # 3. SKU信息
        # 4. 规格信息
        goods_specs = get_goods_specs(sku)

        context = {
            'categories': categories,
            'breadcrumb': breadcrumb,
            'sku': sku,
            "goods_specs": goods_specs
        }

        return render(request, 'detail.html', context)


# 统计每一天的分类商品访问量
"""
前端:
    统计每一天的分类商品访问量
后端:
    请求：
        接受请求，获取数据
    业务逻辑：
        查询有没有，有的话，更新数据，没有的话新建数据
    响应：
        返回JSON
    
    路由:
        POST detail/visit/<category_id>/
        
    步骤：
        # 1.接受分类id
        # 2.验证分类id
        # 3.查询当天这个分类的记录有没有
        # 4.没有则新建数据
        # 5.有的话更新数据
        # 6.返回响应

"""

from apps.goods.models import GoodsVisitCount
import datetime


class CategoryVisitCountView(View):

    def post(self, request, category_id):
        # 1.接受分类id
        # 2.验证分类id
        try:
            category = GoodsCategory.objects.get(id=category_id)
        except GoodsCategory.DoesNotExist:
            return JsonResponse({'code': 400, 'errmsg': '没有此分类'})

        # 3.查询当天这个分类的记录有没有
        today = datetime.date.today()
        try:
            gvc = GoodsVisitCount.objects.get(category=category, date = today)
        except GoodsVisitCount.DoesNotExist:
            # 4.没有则新建数据
            GoodsVisitCount.objects.create(category=category, date=today, count=1)
            pass
        else:
            # 5.有的话更新数据
            gvc.count += 1
            gvc.save()

        # 6.返回响应
        return JsonResponse({"code":0, "errmsg":"ok"})
